#include <unistd.h>
#include "stdio.h"
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "hi_gpio.h"
#include "hi_io.h"

osThreadId_t task1Id;
osThreadId_t task2Id;

void Task1(void *arg){
    while(1){
        printf("Task1 is running\n");
        sleep(1);
        // osDelay(1000);
    }
}

void Task2(void *arg){
    while(1){
        printf("Task2 is running\n");
        // osDelay(5000);
        sleep(5);
        osThreadSuspend(task1Id);
        printf("Task2 suspended Task1\n");
        // osDelay(5000); // 等待5秒
        sleep(5);
        osThreadResume(task1Id);
        printf("Task2 resumed Task1\n");
    }
}


void task_demo(void)
{
    osThreadAttr_t attr1 = {
        .name = "Task1",                // 任务名称
        .attr_bits = 0U,                // 任务属性位
        .cb_mem = NULL,                 // 任务控制块内存
        .cb_size = 0U,                  // 任务控制块大小
        .stack_mem = NULL,              // 任务栈内存
        .stack_size = 1024,             // 任务栈大小，单位为Byte
        .priority = osPriorityNormal,   // 任务优先级
    };

    //创建Task1任务，返回任务ID，如果创建失败，返回NULL
    // 此处函数的第二个参数NULL就是函数Task2(void)中的参数，由于Task2(void)没有参数，所以此处也传入参数NULL
    task1Id = osThreadNew((osThreadFunc_t)Task1, NULL, &attr1); 
    if (task1Id == NULL) {
        printf("[Task1] Failed to create task!\n");
    }
    else{
        printf("[Task1] Task ID is %d\n",task1Id);
    }

    osThreadAttr_t attr2 = {
        .name = "Task2",                // 任务名称
        .attr_bits = 0U,                // 任务属性位
        .cb_mem = NULL,                 // 任务控制块内存
        .cb_size = 0U,                  // 任务控制块大小
        .stack_mem = NULL,              // 任务栈内存
        .stack_size = 2048,             // 任务栈大小
        .priority = osPriorityNormal1,  // 任务优先级，此处略高于Task1
    };
    
    //创建Task2任务，返回任务ID，如果创建失败，返回NULL
    task2Id = osThreadNew((osThreadFunc_t)Task2, NULL, &attr2);
    if (task2Id == NULL) {
        printf("[Task2] Failed to create task!\n");
    }
    else{
        printf("[Task2] Task ID is %d\n",task2Id);
    }
}

SYS_RUN(task_demo);